#include "key.h"

gpio_pin_enum key_pin[KEY_COUNT] = {A8 , D8 , B12 , B0 }; // 按键引脚，移植时请根据实际情况修改
int8 operation_key = 0;                            // 按键操作值

/**
 * @brief 按键初始化
 *
 */
void Key_init()
{
    for (int i = 0; i < KEY_COUNT; i++)
    {
        gpio_init(key_pin[i], GPI, 1, GPIO_INT_CONFIG);
    }
}

/**
 * @brief 旋钮初始化
 *
 */
// void knob_init()
// {
//     qtimer_quad_init(KNOB_QTIMER, KNOB_A, KNOB_B);
//     gpio_init(KNOB_BUTTON, GPI, 1, GPIO_INT_CONFIG);
// }

/**
 * @brief 按键扫描
 *        移植时请根据使用的键盘类型修改此函数，应返回从 0 开始的按键值
 *
 * @return int8 当前按下的按键编号，-1 表示没有按键按下
 */
int8 key_scan()
{
    for (int i = 0; i < KEY_COUNT; i++)
    {
        if (gpio_get_level(key_pin[i]) == 0)
        {
            return i;
        }
    }

    return -1;
}

/**
 * @brief 按键检查
 *
 * @return int8 返回当前的按键操作
 *              0：无操作，正数：单击，负数：长按
 */
int8 key_check()
{
    static int8 last_key = -1;                        // 上次按键值
    static uint16 key_pressed_count[KEY_COUNT] = {0}; // 按键按下计数

    int8 current_key = key_scan(); // 当前按键值
    int8 current_op = 0;           // 当前操作

    if (current_key != -1)
    {
        // 当按键按下且等于上次按键值时，计数加 1，否则清零
        for (int i = 0; i < KEY_COUNT; i++)
        {
            if (current_key == i && last_key == i)
            {
                key_pressed_count[i]++;

                if (key_pressed_count[i] >= (CONTINUOUS_PRESS_TIME + CONTINUOUS_PRESS_INTERVAL))
                {
                    current_op = current_key + 1;
                    key_pressed_count[i] = CONTINUOUS_PRESS_TIME;
                }
            }
            else
            {
                key_pressed_count[i] = 0;
            }
        }
    }
    else
    {
        // 当按键松开时，检查按键是单击还是长按
        if (last_key != -1)
        {
            if (key_pressed_count[last_key] < LONG_PRESS_TIME)
            {
                current_op = last_key + 1;
            }
            else if (key_pressed_count[last_key] < CONTINUOUS_PRESS_TIME)
            {
                current_op = -(last_key + 1);
            }
        }
    }

    last_key = current_key; // 更新上次按键值

    return current_op;
}

// int8 knob_check()
// {
//     static bool last_button = false;       // 上次按键值
//     static int16 button_pressed_count = 0; // 按键按下计数
//     static int8 last_op = 0;               // 上次操作值

//     int16 encoder_value = qtimer_quad_get(KNOB_QTIMER, KNOB_A); // 旋钮值
//     bool button_pressed = gpio_get(KNOB_BUTTON) == 0;           // 按钮值
//     int8 current_op = 0;                                        // 当前操作

//     if (encoder_value != 0)
//     {
//         // 当旋钮值不为 0 时，判断旋钮方向
//         if (encoder_value < 0)
//         {
//             current_op = KEY_DOWN;
//         }
//         else if (encoder_value > 0)
//         {
//             current_op = KEY_UP;
//         }

//         // 如果旋转过程中按下了按钮，则返回长按操作
//         if (button_pressed)
//         {
//             current_op = -current_op;
//         }

//         if (abs(encoder_value) > 1 && last_op != KEY_ENTER)
//         {
//             current_op = last_op;
//         }
//     }
//     else
//     {
//         if (button_pressed && last_button)
//         {
//             // 当按键按下且等于上次按键值时，计数加 1，否则清零
//             button_pressed_count++;
//         }
//         else if (last_button)
//         {
//             // 当按键松开时，检查按键是单击还是长按
//             if (button_pressed_count < LONG_PRESS_TIME)
//             {
//                 current_op = KEY_ENTER;
//             }
//             else
//             {
//                 current_op = KEY_DISPLAY_SWITCH;
//             }

//             button_pressed_count = 0;
//         }
//     }

//     qtimer_quad_clear(KNOB_QTIMER, KNOB_A);
//     last_button = button_pressed;

//     if (current_op != 0)
//     {
//         last_op = current_op;
//     }

//     return current_op;
// }

/**
 * @brief 按键操作值执行动作
 * 
 */
void operation_key_action()
{
    if (operation_key)
    {
        switch (display_mode)
        {
        case MENU:
            menu_key_action(operation_key);
            break;
        case CAMERA:
            //camera_key_action(operation_key);
            break;
        default:
            break;
        }

        operation_key = 0;
    }
}

/**
 * @brief 获取按键操作值，需要在 1ms 周期中断中调用
 *
 */
void operation_key_get()
{
    if (!operation_key)
    {
        operation_key = key_check();
    }

    // if (!operation_key)
    // {
    //     operation_key = knob_check();
    // }
}
